package com.bjbn.tasks;

import com.bjbn.config.ScheduleConfig;
import com.bjbn.service.BmsDataService;
import com.bjbn.service.ElevatorAlarmService;
import com.bjbn.service.WalkwayAlarmService;
import com.bjbn.service.EqptMappingCacheService;
import com.bjbn.service.AirConditionerAlarmService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

/**
 * BMS定时任务
 */
@Slf4j
@Component
public class MyScheduledTasks {

    private final ScheduleConfig scheduleConfig;

    // 通过构造函数注入配置
    public MyScheduledTasks(ScheduleConfig scheduleConfig) {
        this.scheduleConfig = scheduleConfig;
    }

    @Autowired
    private BmsDataService bmsDataService;

    @Autowired
    private ElevatorAlarmService elevatorAlarmService;

    @Autowired
    private WalkwayAlarmService walkwayAlarmService;

    @Autowired
    private EqptMappingCacheService eqptMappingCacheService;

    @Autowired
    private AirConditionerAlarmService airConditionerAlarmService;

    /**
     * 每10分钟同步一次BMS设备采集值数据（不含电梯扶梯和步道梯，温湿度和照度）
     */
//    @Scheduled(fixedDelayString = "${task.bms.interval}")
//    public void syncBmsDeviceValueData() {
//        log.info("定时任务：同步BMS设备采集值数据开始");
//        bmsDataService.processDeviceValueData();
//        log.info("定时任务：同步BMS设备采集值数据结束");
//    }

    /**
     * 每分钟同步一次温湿度传感器状态
     */
    @Scheduled(cron = "${task.schedule.thsCron}")
    public void syncThsState() {
        log.info("定时任务：同步温湿度传感器状态开始");
        bmsDataService.processThsState();
        log.info("定时任务：同步温湿度传感器状态结束");
    }

    /**
     * 每分钟同步一次照度传感器状态
     */
    @Scheduled(cron = "${task.schedule.lxCron}")
    public void syncLxState() {
        log.info("定时任务：同步照度传感器状态开始");
        bmsDataService.processLxState();
        log.info("定时任务：同步照度传感器状态结束");
    }

    /**
     * 每3分钟检测电梯扶梯故障并推送报警
     */
    @Scheduled(cron = "${task.schedule.elevatorCron}")
    public void elevatorAlarmTask() {
        log.info("定时任务：电梯扶梯故障检测开始");
        elevatorAlarmService.detectAndPushElevatorAlarms();
        log.info("定时任务：电梯扶梯故障检测结束");
    }

    /**
     * 每3分钟检测步道梯故障并推送报警
     */
    @Scheduled(cron = "${task.schedule.walkwayCron}")
    public void walkwayAlarmTask() {
        log.info("定时任务：步道梯故障检测开始");
        walkwayAlarmService.detectAndPushWalkwayAlarms();
        log.info("定时任务：步道梯故障检测结束");
    }

    /**
     * 每分钟检测一体化空调报警并推送报警
     */
    @Scheduled(cron = "${task.schedule.airConditionCron}")
    public void airConditionerAlarmTask() {
        log.info("定时任务：一体化空调报警检测开始");
        try {
            airConditionerAlarmService.detectAndPushAirConditionerAlarms();
            log.info("定时任务：一体化空调报警检测结束");
        } catch (Exception e) {
            log.error("定时任务：一体化空调报警检测失败", e);
        }
    }


    /**
     * 每日凌晨2点同步一次设备分组数据
     */
    @Scheduled(cron = "0 0 2 * * ?")
    public void syncBmsDeviceGroupData() {
        log.info("定时任务：每日同步BMS设备分组数据开始");
        bmsDataService.processDeviceGroupData();
        log.info("定时任务：每日同步BMS设备分组数据结束");
    }

    /**
     * 每日凌晨3点同步一次设备信息数据
     */
    @Scheduled(cron = "0 0 3 * * ?")
    public void syncBmsDeviceInfoData() {
        log.info("定时任务：每日同步BMS设备信息数据开始");
        bmsDataService.processDeviceInfoData();
        log.info("定时任务：每日同步BMS设备信息数据结束");
    }

    /**
     * 每5分钟刷新一次资产映射缓存
     */
    @Scheduled(cron = "0 */5 * * * ?")
    public void refreshEqptMappingCache() {
        log.info("定时任务：刷新资产映射缓存开始");
        try {
            eqptMappingCacheService.refreshCache();
            log.info("定时任务：刷新资产映射缓存完成");
        } catch (Exception e) {
            log.error("定时任务：刷新资产映射缓存失败", e);
        }
    }


} 